<?php
class CAPCHA {
	private $_KEY = array (0 => array (0 => 0, 1 => 0, 2 => 0, 3 => 0 ), 1 => array (0 => 0, 1 => 0, 2 => 0, 3 => 0 ), 2 => array (0 => 0, 1 => 0, 2 => 0, 3 => 0 ), 3 => array (0 => 0, 1 => 0, 2 => 0, 3 => 0 ) ), $_TURN = array (0 => array (- 1, 0 ), 1 => array (0, 1 ), 2 => array (1, 0 ), 3 => array (0, - 1 ), 4 => array (- 1, 1 ), 5 => array (1, - 1 ), 6 => array (1, 1 ), 7 => array (- 1, - 1 ) );
	public function __construct() {
		//header ("Content-Type: image/jpeg");
		$this->Clear ();
	}
	function Create() {
		// очистка
		$this->Clear ();
		// начальная точка
		mt_rand ();
		$turn_x = mt_rand ( 0, 3 );
		$turn_y = mt_rand ( 0, 3 );
		$this->_KEY [$turn_y] [$turn_x] = 1;
		$i = 1;
		$n = mt_rand ( 3, 5 );
		while ( $i < $n ) {
			// определение возможных ходов
			$turnArr = array ();
			$nTurn = 0;
			for($k = 0; $k < 8; $k ++) {
				$y = $this->_TURN [$k] [0];
				$x = $this->_TURN [$k] [1];
				if (isset ( $this->_KEY [$turn_y + $y] [$turn_x + $x] ) && $this->_KEY [$turn_y + $y] [$turn_x + $x] == 0) {
					$turnArr [$nTurn] = $k;
					$nTurn ++;
				}
			}
			// нет возможных ходов
			if ($nTurn == 0) {
				break;
			}
			// выполнение случайного хода
			$rTurn = mt_rand ( 0, $nTurn - 1 );
			$turn_y += $this->_TURN [$turnArr [$rTurn]] [0];
			$turn_x += $this->_TURN [$turnArr [$rTurn]] [1];
			$this->_KEY [$turn_y] [$turn_x] = 1;
			$i ++;
		}
		// сохранение кода в сессии
		$_SESSION ["capcha"] = $this->_KEY;
		return 0;
	}
	// вывод картинки
	function Render() {
		// создание выводимого изображения
		$render_img = imagecreatetruecolor ( 100, 100 );
		// залива фоном
		$white = imagecolorallocate ( $render_img, 255, 255, 255 );
		imagefill ( $render_img, 0, 0, $white );
		// загрузка изображений
		$img_nosell = imagecreatefrompng ( SITE_PATH . "/images/capcha_nosell.png" );
		$img_sell = imagecreatefrompng ( SITE_PATH . "/images/capcha_sell.png" );
		for($i = 0; $i < 4; $i ++) {
			for($j = 0; $j < 4; $j ++) {
				if ($this->_KEY [$i] [$j] == 1) {
					imagecopy ( $render_img, $img_sell, $j * 25, $i * 25, 0, 0, 25, 25 );
				} else {
					imagecopy ( $render_img, $img_nosell, $j * 25, $i * 25, 0, 0, 25, 25 );
				}
			}
		}
		//header ('Content-Type: image/jpeg');
		imageinterlace ( $render_img, true );
		imagejpeg ( $render_img, NULL, 100 );
		imagedestroy ( $render_img );
		imagedestroy ( $img_nosell );
		imagedestroy ( $img_sell );
	}
	// проверка капчи
	function Check($cKEY) {
		for($i = 0; $i < 4; $i ++) {
			for($j = 0; $j < 4; $j ++) {
				if ($this->_KEY [$i] [$j] != $cKEY [$i] [$j]) {
					return FALSE;
				}
			}
		}
		return TRUE;
	}
	// очистка ключа
	function Clear() {
		for($i = 0; $i < 4; $i ++) {
			for($j = 0; $j < 4; $j ++) {
				$this->_KEY [$i] [$j] = 0;
			}
		}
		return 0;
	}
	// установка ключа
	function SetKey(&$setKEY) {
		for($i = 0; $i < 4; $i ++) {
			for($j = 0; $j < 4; $j ++) {
				$this->_KEY [$i] [$j] = $setKEY [$i] [$j];
			}
		}
		return 0;
	}
}
?>
